package compartido;


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import persistencia.compartido.CargadorDeClases;

/**
 *  Un registro asocia un identificador auto-incremental a cada clase
 * registrada (mediante el metodo getNuevoIdentificador).
 *  Además provee metodos para cargarlo e iterar su contenido.
 */
public class RegistroDeIdentificadores implements Iterable<Entry<Class<? extends IEntidad>, Long>> {
	protected static RegistroDeIdentificadores instancia = null;
	
	public static RegistroDeIdentificadores getInstancia() {
		if (instancia == null)
			instancia = new RegistroDeIdentificadores();
		return instancia;
	}
	
	protected static long idInicial = 1L;
	protected static long idNulo = 0L;
	protected static long idMaximo = Long.MAX_VALUE;
	
	protected Map<Class<? extends IEntidad>, Long> idActual;
	
	protected String nombreDeClase(Class<? extends IEntidad> clase) {
		return clase.getCanonicalName();
	}
	
	protected RegistroDeIdentificadores() {
		idActual = new HashMap<Class<? extends IEntidad>, Long>();
	}

	public long getNuevoIdentificador(Class<? extends IEntidad> clase) {
		Long actual = idActual.get(clase);
		if (actual == null)
			actual = idInicial;
		
		idActual.put(clase, actual+1);
		return actual;
	}
	
	public void limpiar() {
		idActual.clear();
	}
	
	protected long leerIdActual(String IdActual) {
		long valor = idNulo;
		try {
			valor = Long.parseLong(IdActual);
		} catch (NumberFormatException formato) {
			valor = idNulo;
		}
		return valor;
	}
	
	public void cargar(Class<? extends IEntidad> clase, long identificador) {
		Long actual = idActual.get(clase);
		if (actual == null)
			idActual.put(clase, identificador);
		else {
			if (actual < identificador)
				idActual.put(clase, identificador);
		}
	}

	@Override
	public Iterator<Entry<Class<? extends IEntidad>, Long>> iterator() {
		return idActual.entrySet().iterator();
	}
}
